AWS CDK で作成した GitHub OIDC provider に複数の thumbprint を登録してみた

AWS CDK で作成した GitHub OIDC provider に複数の thumbprint を登録してみた

Clock Icon2023.07.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部 Delivery部の若槻です。

最近、GitHub から次のようなアナウンスがありました。

GitHub Actions で2つの SSL 中間証明書が使用されるようになったため、OIDC プロバイダーの thumbprint に次の2つの thumbprint の登録が必要となりました。

  • 6938fd4d98bab03faadb97b34396831e3780aea1
  • 1c58a3a8518e8759bf075b76b750d4f2df264fcd

今までは 6938fd4d98bab03faadb97b34396831e3780aea1 のみ登録されていれば良かったのですが、今後は上記の両方を登録しなければ、GitHub Actions からの AssumeRole が次のエントリで紹介しているエラー(※)となってしまいます。

※登録されていない証明書が通信に使用された場合

今回は、GitHub OIDC provider を AWS CDK で構成している場合の、複数の thumbprint の登録を試してみました。

thumbprint を明示的に指定しない場合

以前に次のエントリで GitHub OIDC provider などの OIDC 連携に必要なリソースを AWS CDK を利用して構成する方法を紹介しました。

その際の CDK コードは下記(一部省略)となります。OIDC provider の作成は OpenIdConnectProvider コンストラクトクラスを利用するのですが、その際に thumbprints は未指定としています。

import { Stack, StackProps, aws_iam } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkDeployGhOidcStack extends Stack {
  constructor(scope: Construct, id: string, props: StackProps) {
    super(scope, id, props);

    // GitHub とのフェデレーション認証を行う OIDC プロバイダーを作成
    const gitHubOidcProvider = new aws_iam.OpenIdConnectProvider(
      this,
      'GitHubOidcProvider',
      {
        url: 'https://token.actions.githubusercontent.com',
        clientIds: ['sts.amazonaws.com'],
      }
    );

    // 中略
  }
}

この時、CDK デプロイにより追加される thumbprint は 6938fd4d98bab03faadb97b34396831e3780aea1 のみとなっています。

$ aws iam get-open-id-connect-provider \
  --open-id-connect-provider-arn ${PROVIDER_ARN}
{
    "Url": "token.actions.githubusercontent.com",
    "ClientIDList": [
        "sts.amazonaws.com"
    ],
    "ThumbprintList": [
        "6938fd4d98bab03faadb97b34396831e3780aea1"
    ],
    "CreateDate": "2023-06-09T15:40:20.811000+00:00",
    "Tags": []
}

OpenIdConnectProvider の仕様を確認する

次のドキュメントで OpenIdConnectProvider コンストラクトクラスの仕様を確認してみます。

OpenIdConnectProvider では、Construct Props でオプションとして thumbprintsstring[] 形式で指定できます。thumbprints は OIDC provider のサーバー証明書の thumbprint のリストを登録できるので、今回のケースでまさに使いたかったプロパティです。

指定可能数は最大 5 つで、また未指定の場合はルート認証局の thumbprint がプロバイダーのサーバーから取得されます。現在既定で取得される thumbprint は前述した 6938fd4d98bab03faadb97b34396831e3780aea1 となっているようです。

thumbprint を明示的に指定してみる

それでは OpenIdConnectProvider 実際に thumbprint を明示的に指定してみます。アナウンスされていた2つの thumbprint を指定します。

import { Stack, StackProps, aws_iam } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkDeployGhOidcStack extends Stack {
  constructor(scope: Construct, id: string, props: StackProps) {
    super(scope, id, props);

    // GitHub とのフェデレーション認証を行う OIDC プロバイダーを作成
    const gitHubOidcProvider = new aws_iam.OpenIdConnectProvider(
      this,
      'GitHubOidcProvider',
      {
        url: 'https://token.actions.githubusercontent.com',
        clientIds: ['sts.amazonaws.com'],
        thumbprints: [
          '6938fd4d98bab03faadb97b34396831e3780aea1',
          '1c58a3a8518e8759bf075b76b750d4f2df264fcd',
        ],
      }
    );

    // 中略
  }
}

CDK デプロイすると、指定した2つの thumbprint が OIDC provider に登録されていることが確認できました。

$ aws iam get-open-id-connect-provider \
  --open-id-connect-provider-arn ${PROVIDER_ARN}
{
    "Url": "token.actions.githubusercontent.com",
    "ClientIDList": [
        "sts.amazonaws.com"
    ],
    "ThumbprintList": [
        "1c58a3a8518e8759bf075b76b750d4f2df264fcd",
        "6938fd4d98bab03faadb97b34396831e3780aea1"
    ],
    "CreateDate": "2023-06-09T15:40:20.811000+00:00",
    "Tags": []
}

その後は GitHub Actions での OIDC 連携も正常にできるようになりました。

登録できる thumbprint の制約

登録できる thumbprint には 40 文字以上のみという制約があります。文字数がそれ以下の thumbprint を指定してみます。

import { Stack, StackProps, aws_iam } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkDeployGhOidcStack extends Stack {
  constructor(scope: Construct, id: string, props: StackProps) {
    super(scope, id, props);

    // GitHub とのフェデレーション認証を行う OIDC プロバイダーを作成
    const gitHubOidcProvider = new aws_iam.OpenIdConnectProvider(
      this,
      'GitHubOidcProvider',
      {
        url: 'https://token.actions.githubusercontent.com',
        clientIds: ['sts.amazonaws.com'],
        thumbprints: [
          '6938fd4d98bab03faadb97b34396831e3780aea1',
          '1c58a3a8518e8759bf075b76b750d4f2df264fcd',
          'hogehoge'
        ],
      }
    );

    // 中略
  }
}

CDK デプロイすると次のエラーとなります。

failed: Error: The stack named cdkCicdResourcesStack failed to deploy: UPDATE_ROLLBACK_COMPLETE: Received response status [FAILED] from custom resource. Message returned: ValidationError: 1 validation error detected: Value '[1c58a3a8518e8759bf075b76b750d4f2df264fcd, 6938fd4d98bab03faadb97b34396831e3780aea1, hogehoge]' at 'thumbprintList' failed to satisfy constraint: Member must satisfy constraint: [Member must have length less than or equal to 40, Member must have length greater than or equal to 40

文字列が短すぎると SSL 証明書の署名の意味を成さないので、この制約は当然といえば当然ですね。

おわりに

GitHub OIDC provider を AWS CDK で構成している場合の、複数の thumbprint の登録を試してみました。

GitHub と AWS の OIDC 連携に使用している中間証明書は、時々変更や追加があるので、エラーが発生した場合にも焦らずに対処したいですね。

参考

以上

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.